﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AudiPyme.DAL;

namespace AudiPyme.BLL
{
    public class EmpresasNegocio
    {
        //Recoge, de una lista de controles aquellos con respuesta Sí, agrupados según su nivel de madurez
        public static List<int> NumeroControlesSiNiveles(List<ControlesCheckList> ValoresControles)
        {
            List<int> NumeroControlesSiNivelMadurez = new List<int>(3);
            int NControlesSiNivel1 = 0;
            int NControlesSiNivel2 = 0;
            int NControlesSiNivel3 = 0;
            for (int i = 0; i < 133; i++)
            {
                if (ValoresControles[i].ValorControl.Trim().Equals("SI"))
                {
                    switch (ValoresControles[i].NivelMadurez)
                    {
                        case 1:
                            NControlesSiNivel1++;
                            break;
                        case 2:
                            NControlesSiNivel2++;
                            break;
                        case 3:
                            NControlesSiNivel3++;
                            break;
                    }
                }
            }
            NumeroControlesSiNivelMadurez.Insert(0, NControlesSiNivel1);
            NumeroControlesSiNivelMadurez.Insert(1, NControlesSiNivel2);
            NumeroControlesSiNivelMadurez.Insert(2, NControlesSiNivel3);
            return NumeroControlesSiNivelMadurez;
        }

        //Recoge, de una lista de controles aquellos con respuesta No, agrupados según su nivel de madurez
        public static List<int> NumeroControlesNoNiveles(List<ControlesCheckList> ValoresControles)
        {
            List<int> NumeroControlesParcialmenteNivelMadurez = new List<int>(3);
            int NControlesNoNivel1 = 0;
            int NControlesNoNivel2 = 0;
            int NControlesNoNivel3 = 0;
            for (int i = 0; i < 133; i++)
            {
                if (ValoresControles[i].ValorControl.Trim().Equals("NO"))
                {
                    switch (ValoresControles[i].NivelMadurez)
                    {
                        case 1:
                            NControlesNoNivel1++;
                            break;
                        case 2:
                            NControlesNoNivel2++;
                            break;
                        case 3:
                            NControlesNoNivel3++;
                            break;
                    }
                }
            }
            NumeroControlesParcialmenteNivelMadurez.Insert(0, NControlesNoNivel1);
            NumeroControlesParcialmenteNivelMadurez.Insert(1, NControlesNoNivel2);
            NumeroControlesParcialmenteNivelMadurez.Insert(2, NControlesNoNivel3);
            return NumeroControlesParcialmenteNivelMadurez;
        }

        //Recoge, de una lista de controles aquellos con respuesta Parcialmente, agrupados según su nivel de madurez
        public static List<int> NumeroControlesParcialmenteNiveles(List<ControlesCheckList> ValoresControles)
        {
            List<int> NumeroControlesParcialmenteNivelMadurez = new List<int>(3);
            int NControlesParcialmenteNivel1 = 0;
            int NControlesParcialmenteNivel2 = 0;
            int NControlesParcialmenteNivel3 = 0;
            for (int i = 0; i < 133; i++)
            {
                if (ValoresControles[i].ValorControl.Trim().Equals("PARC"))
                {
                    switch (ValoresControles[i].NivelMadurez)
                    {
                        case 1:
                            NControlesParcialmenteNivel1++;
                            break;
                        case 2:
                            NControlesParcialmenteNivel2++;
                            break;
                        case 3:
                            NControlesParcialmenteNivel3++;
                            break;
                    }
                }
            }
            NumeroControlesParcialmenteNivelMadurez.Insert(0, NControlesParcialmenteNivel1);
            NumeroControlesParcialmenteNivelMadurez.Insert(1, NControlesParcialmenteNivel2);
            NumeroControlesParcialmenteNivelMadurez.Insert(2, NControlesParcialmenteNivel3);
            return NumeroControlesParcialmenteNivelMadurez;
        }

        //Recoge, de una lista de controles aquellos con respuesta No Aplica, agrupados según su nivel de madurez
        public static List<int> NumeroControlesNoAplicaNiveles(List<ControlesCheckList> ValoresControles)
        {
            List<int> NumeroControlesNoAplicaNivelMadurez = new List<int>(3);
            int NControlesNoAplicaNivel1 = 0;
            int NControlesNoAplicaNivel2 = 0;
            int NControlesNoAplicaNivel3 = 0;
            for (int i = 0; i < 133; i++)
            {
                if (ValoresControles[i].ValorControl.Trim().Equals("N/A"))
                {
                    switch (ValoresControles[i].NivelMadurez)
                    {
                        case 1:
                            NControlesNoAplicaNivel1++;
                            break;
                        case 2:
                            NControlesNoAplicaNivel2++;
                            break;
                        case 3:
                            NControlesNoAplicaNivel3++;
                            break;
                    }
                }
            }
            NumeroControlesNoAplicaNivelMadurez.Insert(0, NControlesNoAplicaNivel1);
            NumeroControlesNoAplicaNivelMadurez.Insert(1, NControlesNoAplicaNivel2);
            NumeroControlesNoAplicaNivelMadurez.Insert(2, NControlesNoAplicaNivel3);
            return NumeroControlesNoAplicaNivelMadurez;
        }

        //Método que calcula el nivel de madurez actual de una empresa según las respuestas de la misma a los controles ISO 27002
        public static int CalcularNivelMadurezActualEmpresa(List<ControlesCheckList> ValoresControles, int IdEmpresa)
        {
            //Inicializamos el valor a un valor centinela
            int NivelMadurezActual = -1;
            List<int> NumeroControlesTotales = new List<int>(3);
            List<int> NumeroControlesSiNivelMadurez = new List<int>(3);
            List<int> NumeroControlesNoAplicaNivelMadurez = new List<int>(3);
            List<int> NumeroControlesParcialmenteNivelMadurez = new List<int>(3);
            NumeroControlesTotales = EmpresasFactory.NumeroControlesTotalesNiveles();
            //Si no se han podido recoger todos los valores correctamente devolvemos un valor centinela
            if (NumeroControlesTotales[0] == -1 || NumeroControlesTotales[1] == -1 || NumeroControlesTotales[2] == -1)
            {
                return -1;
            }
            else
            {
                //Recogemos los controles que han sido positivos para cada nivel
                NumeroControlesSiNivelMadurez = NumeroControlesSiNiveles(ValoresControles);
                NumeroControlesNoAplicaNivelMadurez = NumeroControlesNoAplicaNiveles(ValoresControles);
                NumeroControlesParcialmenteNivelMadurez = NumeroControlesParcialmenteNiveles(ValoresControles);
                double mediaNivel1 = 0.0;
                double mediaNivel2 = 0.0;
                double mediaNivel3 = 0.0;
                mediaNivel1 = (NumeroControlesSiNivelMadurez[0] + (NumeroControlesParcialmenteNivelMadurez[0] * 0.5)) /
                              (NumeroControlesTotales[0] - NumeroControlesNoAplicaNivelMadurez[0]);
                mediaNivel2 = (NumeroControlesSiNivelMadurez[1] + (NumeroControlesParcialmenteNivelMadurez[1] * 0.5)) /
                              (NumeroControlesTotales[1] - NumeroControlesNoAplicaNivelMadurez[1]);
                mediaNivel3 = (NumeroControlesSiNivelMadurez[2] + (NumeroControlesParcialmenteNivelMadurez[2] * 0.5)) /
                              (NumeroControlesTotales[2] - NumeroControlesNoAplicaNivelMadurez[2]);
                if (mediaNivel1 < 0.9)
                {
                    NivelMadurezActual = 1;
                }
                else
                {
                    if (mediaNivel2 < 0.9)
                    {
                        NivelMadurezActual = 2;
                    }
                    else
                    {
                        NivelMadurezActual = 3;
                    }
                }
            }
            return NivelMadurezActual;
        }

        //Método que devuelve si el número de empleados de una empresa concuerda su tamaño (IdTipoEmpresa)
        public static bool CompruebaEmpleados(int NumEmpleados, int IdTipoEmpresa)
        {
            bool ok = true;
            switch (IdTipoEmpresa)
            {
                case 1:
                    if (NumEmpleados > 9)
                        ok = false;
                    break;
                case 2:
                    if (NumEmpleados > 49 || NumEmpleados < 10)
                        ok = false;
                    break;
                case 3:
                    if (NumEmpleados < 50 || NumEmpleados > 249)
                        ok = false;
                    break;
            }
            return ok;
        }
    }
}
